package Array;//我们把数组 A 中符合下列属性的任意连续子数组 B 称为 “山脉”：
//
// 
// B.length >= 3 
// 存在 0 < i < B.length - 1 使得 B[0] < B[1] < ... B[i-1] < B[i] > B[i+1] > ... > 
//B[B.length - 1] 
// 
//
// （注意：B 可以是 A 的任意子数组，包括整个数组 A。） 
//
// 给出一个整数数组 A，返回最长 “山脉” 的长度。 
//
// 如果不含有 “山脉” 则返回 0。 
//
// 
//
// 示例 1： 
//
// 输入：[2,1,4,7,3,2,5]
//输出：5
//解释：最长的 “山脉” 是 [1,4,7,3,2]，长度为 5。
// 
//
// 示例 2： 
//
// 输入：[2,2,2]
//输出：0
//解释：不含 “山脉”。
// 
//
// 
//
// 提示： 
//
// 
// 0 <= A.length <= 10000 
// 0 <= A[i] <= 10000 
// 
// Related Topics 数组 双指针 动态规划 枚举 👍 210 👎 0


//leetcode submit region begin(Prohibit modification and deletion)
class longestMountain {
    public  int longestMountain(int[] arr) {
        /**
         * 最长山脉子数组长度，因此是连续的，遍历数组，以一个递增和递减为一个山脉，不符合就越过 将
         * 山脉开始位置更新到结束位置，开始下一轮的遍历
         * */
        int len = arr.length; //总长度
        int left = 0;
        int res = 0;
        //三个值才能构成一个山脉，后面不够三就没必要遍历
        while(left+2<len){
            int right = left+1;
            //当前是递增
            if(arr[left] < arr[left+1]){
                //山脚的指针开始平移，直到遇到递减
               while (right+1<len && arr[right] < arr[right+1]){
                   right++;
               }
               //递增结束，开始递减，平移山脚指针
               if(right+1<len && arr[right] > arr[right+1]){
                   while(right+1<len && arr[right] > arr[right+1]){
                       right++;
                   }
                   //递减结束，记录当前山脉的长度
                   res = Math.max(res, right-left+1);
               }else{
                   //如果递增结束，不是紧接着递减那么是遇到了 [1,2,3,3]的抢矿，即重复，这构不成山脉
                   right++;
               }
            }
            //如果初始就是递减或者相等的情况比如，[2,2,1]那么left=right相当于在平移指针，直到找到符合递增的情况
            left = right;  //更新新的山脉开始位置
        }

        return res;
    }
}
//leetcode submit region end(Prohibit modification and deletion)
